home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Freeware 31 / FreelogHS31.iso / ArgentCompta / Bankperfect / bp.exe / Scripts / Auto Fields / auto_fields.py < prev   
Text File  |  2006-01-15  |  12KB  |  339 lines

  1. # v 0.6
  2. import BP, cPickle
  3.  
  4. ak = ["akLeft", "akBottom"]
  5. ck = "TCheckBox"
  6. cb = "TComboBox"
  7. bt = "TButton"
  8. fh = "Ex: ½ cinΘma ╗ ou ½ =details[:10] ╗\n\nVariables disponibles :\ndate, mode, tiers, details et montant"
  9. no = "- InchangΘ -"
  10. none = "- Aucune -"
  11.  
  12. i = BP.AccountCurrent()
  13. ODat = BP.OperationDate[i]
  14. OMod = BP.OperationMode[i]
  15. OWho = BP.Operationthirdparty[i]
  16. OInf = BP.OperationDetails[i]
  17. OAmt = BP.OperationAmount[i]
  18. OCtg = BP.OperationCateg[i]
  19. CPrt = BP.CategParent
  20. sl = SingleLine()
  21.  
  22. fields = ["Tiers", "DΘtails", "Tiers ou DΘtails"]
  23. str_modes = [BP.OperationGetNameFromModeIndex(i) for i in range(10)]
  24.  
  25. cnames = BP.CategName
  26. CTrimNames = []
  27. CPositions = {-1: -1}
  28. CIndexes = {-1: -1}
  29. CNames = []
  30. for i, c in enumerate(cnames):
  31.   p = c.find("=")
  32.   CNames.append(c[p+1:])
  33.   CTrimNames.append(c[p+1:].strip())
  34.   idx = int(c[:p])
  35.   CPositions[idx] = i
  36.   CIndexes[i] = idx
  37.  
  38.  
  39. ic = "\n".join([none] + CNames)
  40. cc = [none] + [ ("%s > %s" %(CTrimNames[CPrt[i]], c), c)[CPrt[i] == i] for i, c in enumerate(CTrimNames)]
  41.  
  42. def EditRule(l):
  43.   CBField.ItemIndex = l["field"]
  44.   EVal.Text = l["contains"]
  45.   CkMod.Checked = l["do_mode"]
  46.   CBMod.ItemIndex = l["mode"]
  47.   ChkWho.Checked = l["do_third"]
  48.   EWho.Text = l["third"]
  49.   CkInf.Checked = l["do_info"]
  50.   EInfo.Text = l["info"]
  51.   CkCtg.Checked = l["do_categ"]
  52.   CBCtg.Items.Text = ic
  53.   CBCtg.ItemIndex = CPositions[l["categ"]] + 1
  54.   CkAct.Checked = l["active"]
  55.   CkAuto.Checked = l.get("withnewline", 0)
  56.   
  57.   if F1.ShowModal() == 1 and EVal.Text != "":
  58.     return {"field": CBField.ItemIndex, "contains": EVal.Text, "do_mode": CkMod.Checked, "mode": CBMod.ItemIndex, "do_third": ChkWho.Checked, "third": EWho.Text, "do_info": CkInf.Checked, "info": EInfo.Text, "do_categ": CkCtg.Checked, "categ": CIndexes[CBCtg.ItemIndex - 1], "active": CkAct.Checked, "withnewline": CkAuto.Checked}
  59.   else: return None
  60.  
  61. def ApplyAll(S):
  62.   T = 0
  63.   for line in file_lines:
  64.     if line["active"]: T += ApplyRule(line, BP.VisibleLines(), 1)
  65.   BP.AccountRefreshScreen()
  66.   if T == 0: s = "Aucune ligne n'a ΘtΘ modifiΘe"
  67.   elif T == 1: s = "Une seule ligne a ΘtΘ modifiΘe"
  68.   else: s = "%d lignes ont ΘtΘ modifiΘes" %T
  69.   BP.MsgBox(s, 64)
  70.  
  71. def ModifLine(S):
  72.   i = Grid.Selection.Top - 1
  73.   if i == -1: return
  74.   l = file_lines[i]
  75.   res = EditRule(l)
  76.   if not res is None:
  77.     file_lines[i] = res
  78.     SaveFile()
  79.  
  80. def Enable(S):
  81.   i = Grid.Selection.Top - 1
  82.   if i == -1: return
  83.   l = file_lines[i]
  84.   l["active"] = not l["active"]
  85.   SaveFile()
  86.  
  87. def Delete(S):
  88.   i = Grid.Selection.Top - 1
  89.   if i == -1: return
  90.   l = file_lines[i]
  91.   if BP.MsgBox("Voulez-vous vraiment supprimer cette rΦgle ?", 36) == 6:
  92.     del file_lines[i]
  93.     SaveFile()
  94.  
  95. def Apply(S):
  96.   i = Grid.Selection.Top - 1
  97.   if i == -1: return
  98.   l = file_lines[i]
  99.   ApplyRule(l, BP.VisibleLines())
  100.   BP.AccountRefreshScreen()
  101.  
  102. def draw(Sender, ACol, ARow, R, State):
  103.   cv = Sender.Canvas
  104.   if "gdSelected" in State: cv.Brush.Color = 0x00dec5b9
  105.   elif ARow > 0 and ARow % 2 == 0: cv.Brush.Color = 0x00f0f0f0
  106.   cv.FillRect(R)
  107.  
  108.   try:
  109.     if ARow == 0:
  110.       s = ["Si je trouve", "Dans le champ", "J'affecte le mode", "Le tiers", "Le dΘtail", "La catΘgorie"][ACol]
  111.       cv.Font.Style = ["fsBold"]
  112.     else: s = code[ARow - 1][ACol]
  113.   except:
  114.     s = ""
  115.  
  116.   if ACol == 1 and ARow > 0 and code[ARow - 1][0].startswith("="): s = ""
  117.  
  118.   if s.startswith("="): cv.Font.Color, s = 0x00CC0000, s[1:]
  119.   elif s in [no, none]: cv.Font.Color = 0x00666666
  120.   else: cv.Font.Color = 0x00000000
  121.  
  122.   if ACol == 0: R.Left = R.Left + 14
  123.   if s != "": cv.TextRect(R, R.Left + 3, R.Top + 5, s)
  124.  
  125.   if ACol == 0 and ARow > 0:
  126.     y = (R.Bottom - R.Top) / 2
  127.     R.Left, R.Right, R.Top, R.Bottom = R.Left - 12, R.Left + - 2, R.Top + y - 5, R.Top + y + 5
  128.     cv.Brush.Color = 0x00000000
  129.     cv.FillRect(R)
  130.     R.Left, R.Right, R.Top, R.Bottom = R.Left + 1, R.Right - 1, R.Top + 1, R.Bottom - 1
  131.     if code[ARow - 1][6]: cv.Brush.Color = 0x0000AA00
  132.     else: cv.Brush.Color = 0x000000CC
  133.     cv.FillRect(R)
  134.  
  135.   cv.Brush.Style = 1
  136.  
  137. def Resize(S):
  138.   Grid.DefaultColWidth = (Grid.Width - 40) / 6
  139.  
  140. def AddLine(S):
  141.   line = {"field": 0, "contains": "", "do_mode": 0, "mode": 0, "do_third": 0, "third": "", "do_info": 0, "info": "", "do_categ": 0, "categ": -1, "active": 0, "withnewline": 0}
  142.   res = EditRule(line)
  143.   if not res is None:
  144.     file_lines.append(res)
  145.     SaveFile()
  146.  
  147.  
  148.  
  149.  
  150. F0 = CreateComponent("TForm", None)
  151. F0.SetProps(Position="poMainFormCenter", Width=770, Height=340, Caption="Calcul automatique des champs", OnResize=Resize)
  152. F0.Constraints.MinWidth = 700
  153. F0.Constraints.MinHeight = 340
  154. F0.Font.Name = "Tahoma"
  155. Grid = CreateComponent("TDrawGrid", F0)
  156. Grid.SetProps(Parent=F0, Top=30, Left=30, Width=710, Height=243, Anchors=ak+["akTop", "akRight"], ColCount=6, FixedCols=0, OnDrawCell=draw, Options = ["goFixedHorzLine", "goVertLine", "goDrawFocusSelected", "goRowSelect", "goThumbTracking"], Hint="Double-cliquez sur une ligne pour l'activer ou la dΘsactiver", ShowHint=1, OnDblClick=Enable)
  157. BAdd = CreateComponent(bt, F0)
  158. BAdd.SetProps(Parent=F0, Left=30, Top=293, Width=90, Height=25, Anchors=ak, Caption="Ajouter", OnClick=AddLine)
  159. BChg = CreateComponent(bt, F0)
  160. BChg.SetProps(Parent=F0, Left=130, Top=293, Width=90, Height=25, Anchors=ak, Caption="Modifier", OnClick=ModifLine)
  161. BDel = CreateComponent(bt, F0)
  162. BDel.SetProps(Parent=F0, Left=226, Top=293, Width=90, Height=25, Anchors=ak, Caption="Supprimer", OnClick=Delete)
  163. BApp = CreateComponent(bt, F0)
  164. BApp.SetProps(Parent=F0, Left=324, Top=293, Width=90, Height=25, Anchors=ak, Caption="Appliquer", OnClick=Apply)
  165. BAppAll = CreateComponent(bt, F0)
  166. BAppAll.SetProps(Parent=F0, Left=422, Top=293, Width=90, Height=25, Anchors=ak, Caption="Appliquer actives", OnClick=ApplyAll)
  167. BQuit = CreateComponent(bt, F0)
  168. BQuit.SetProps(Parent=F0, Left=522, Top=293, Width=90, Height=25, Anchors=ak, Caption="Fermer", Cancel=1, Default=1, ModalResult=1)
  169.  
  170. F1 = CreateComponent("TForm", None)
  171. F1.SetProps(Width=430, Height=380, Caption="Correspondance", Position="poMainFormCenter", BorderStyle="bsSingle", BorderIcons=["biSystemMenu"])
  172. L0 = CreateComponent("TLabel", F1)
  173. L0.SetProps(Parent=F1, Left=30, Top=25, Width=60, Caption="Si le champ :")
  174. L1 = CreateComponent("TLabel", F1)
  175. L1.SetProps(Parent=F1, Left=30, Top=53, Width=92, Caption="Contient la valeur :")
  176. CBField = CreateComponent(cb, F1)
  177. CBField.SetProps(Parent=F1, Left=196, Top=20, Width=200, Style="csDropDownList")
  178. CBField.Items.Text = "\n".join(fields)
  179. EVal = CreateComponent("TEdit", F1)
  180. EVal.SetProps(Parent=F1, Left=196, Top=48, Width=200, Hint="Ex: ½ cinΘma ╗ ou ½ salaire+!chantal ╗", ShowHint=1)
  181. CkMod = CreateComponent(ck, F1)
  182. CkMod.SetProps(Parent=F1, Left=30, Top=89, Width=134, Caption="J'applique le mode :")
  183. CBMod = CreateComponent(cb, F1)
  184. CBMod.SetProps(Parent=F1, Left=196, Top=86, Width=200, Style="csDropDownList")
  185. CBMod.Items.Text = "\n".join(str_modes)
  186. ChkWho = CreateComponent(ck, F1)
  187. ChkWho.SetProps(Parent=F1, Left=30, Top=126, Width=160, Caption="J'applique le tiers :")
  188. EWho = CreateComponent("TEdit", F1)
  189. EWho.SetProps(Parent=F1, Left=196, Top=124, Width=200, Hint=fh, ShowHint=1)
  190. CkInf = CreateComponent(ck, F1)
  191. CkInf.SetProps(Parent=F1, Left=30, Top=164, Width=160, Caption="J'applique le dΘtail :")
  192. EInfo = CreateComponent("TEdit", F1)
  193. EInfo.SetProps(Parent=F1, Left=196, Top=162, Width=200, Hint=fh, ShowHint=1)
  194. CkCtg = CreateComponent(ck, F1)
  195. CkCtg.SetProps(Parent=F1, Left=30, Top=203, Width=134, Caption="J'applique la catΘgorie :")
  196. CBCtg = CreateComponent(cb, F1)
  197. CBCtg.SetProps(Parent=F1, Left=196, Top=200, Width=200, Style="csDropDownList")
  198. CkAct = CreateComponent(ck, F1)
  199. CkAct.SetProps(Parent=F1, Left=30, Top=240, Width=300, Caption="Activer la rΦgle")
  200. CkAuto = CreateComponent(ck, F1)
  201. CkAuto.SetProps(Parent=F1, Left=30, Top=260, Width=300, Caption="Appliquer automatiquement α chaque nouvelle ligne")
  202. BOK = CreateComponent(bt, F1)
  203. BOK.SetProps(Parent=F1, Left=110, Top=300, Width=90, Height=25, Caption="OK", Default=1, ModalResult=1)
  204. BCnl = CreateComponent(bt, F1)
  205. BCnl.SetProps(Parent=F1, Left=210, Top=300, Width=90, Height=25, Caption="Annuler", Cancel=1, ModalResult=2)
  206.  
  207. exe_path = BP.BankPerfectExePath()
  208. file_name = BP.BankPerfectFileName()
  209. file_name = file_name[file_name.rfind("\\") + 1:-3]
  210. file_path = exe_path + "Scripts\\Auto Fields\\%s.dat" %file_name
  211.  
  212. def SaveFile():
  213.   f = open(file_path, "w")
  214.   cPickle.dump(file_lines, f)
  215.   f.close()
  216.   global code
  217.   code = FillGrid(file_lines)
  218.   i = Grid.Selection.Top
  219.   C = len(file_lines)
  220.   Grid.RowCount = C + 1
  221.   Grid.Repaint()
  222.   if i > 0 and i <= C: Grid.Row = i
  223.  
  224. def LoadFile():
  225.   global file_lines
  226.   try:
  227.     f = open(file_path, "r")
  228.     file_lines = cPickle.load(f)
  229.     f.close()
  230.   except:
  231.     file_lines = []
  232.  
  233. def ApplyRule(line, AccountLines, silent = 0):
  234.   field = line["field"]
  235.   lfield = fields[field].lower()
  236.   if not silent and line["do_categ"] and not (line["categ"] in CPositions.keys()):
  237.     BP.MsgBox("La catΘgorie α appliquer n'existe pas", 64)
  238.     return
  239.  
  240.   ops = []
  241.   i = 0
  242.   val = line["contains"]
  243.   if val[0] == "=": ask, val, formula = "formule", val[1:], 1
  244.   else: ask, formula = "rΦgle", 0
  245.  
  246.   for i in AccountLines:
  247.     simple = 1
  248.     if formula:
  249.       date, mode, tiers, details, montant = ODat[i], OMod[i], OWho[i], OInf[i], OAmt[i]
  250.       try:
  251.         if eval(val): ops.append(i)
  252.         simple = 0
  253.       except: pass
  254.     if simple:
  255.       if   field == 0: op = OWho[i]
  256.       elif field == 1: op = OInf[i]
  257.       elif field == 2: op = OWho[i] + " " + OInf[i]
  258.       if MatchVal(op, val): ops.append(i)
  259.  
  260.   nb_lines = len(ops)
  261.   if nb_lines > 0:
  262.     if nb_lines == 1: s1, s2 = "une seule ligne qui vΘrifie la %s ½ %s ╗" %(ask, val), "la"
  263.     else: s1, s2 = "%d lignes qui vΘrifient la %s ½ %s ╗" %(nb_lines, ask, val), "les"
  264.     if sl == -1 and BP.MsgBox("Il y a %s.\n\nSouhaitez-vous %s modifier ?" %(s1, s2), 36) != 6: return 0
  265.     for i in ops:
  266.       tiers, details, date, montant, mode = OWho[i], OInf[i], ODat[i], OAmt[i], OMod[i]
  267.  
  268.       if line["do_mode"]:
  269.         m = line["mode"]
  270.         v = OAmt[i]
  271.         mode_value = str_modes[m]
  272.         if (m <= 5 and v < 0) or (m >= 6 and v > 0): OMod[i] = mode_value
  273.  
  274.       if line["do_third"]:
  275.         s = line["third"]
  276.         if s <> "" and s[0] == "=":
  277.           try: s = eval(s[1:])
  278.           except: pass
  279.         OWho[i] = s
  280.  
  281.       if line["do_info"] :
  282.         s = line["info"]
  283.         if s <> "" and s[0] == "=":
  284.           try: s = eval(s[1:])
  285.           except: pass
  286.         OInf[i] = s
  287.  
  288.       if line["do_categ"]: OCtg[i] = line["categ"]
  289.   elif not silent:
  290.     BP.MsgBox("Aucune ligne rΘpondant aux critΦres n'a ΘtΘ trouvΘe", 0)
  291.   return nb_lines
  292.  
  293. def MatchVal(line, value):
  294.   vals = value.split("+")
  295.   for v in vals:
  296.     if v == "": continue
  297.     if v[0] == "!":
  298.       must_find = 0
  299.       v = v[1:]
  300.     else:
  301.       must_find = 1
  302.     found = line.find(v) > -1
  303.     if must_find and not found: return 0
  304.     if not must_find and found: return 0
  305.   return 1
  306.  
  307. def FillGrid(file_lines):
  308.   code = []
  309.   for l in file_lines:
  310.     if l.get("do_mode", 0):
  311.       idx = l["mode"]
  312.       if idx >= len(str_modes): idx = 0
  313.       m = str_modes[idx]
  314.     else: m = no
  315.  
  316.     if l.get("do_third", 0): t = l["third"]
  317.     else: t = no
  318.     if l.get("do_info", 0): i = l["info"]
  319.     else: i = no
  320.  
  321.     if l.get("do_categ", 0):
  322.       idx = CPositions[l["categ"]] + 1
  323.       if idx >= len(cc): idx = 0
  324.       c = cc[idx]
  325.     else: c = no
  326.     code.append([l["contains"], fields[l["field"]], m, t, i, c, l.get("active", 0)])
  327.   return code
  328.  
  329. LoadFile()
  330.  
  331. if sl > -1:
  332.   for l in file_lines:
  333.     if l.get("withnewline", 0):
  334.       ApplyRule(l, [sl], 1)
  335.   BP.AccountRefreshScreen()
  336. elif file_name != "":
  337.   code = FillGrid(file_lines)
  338.   Grid.RowCount = len(file_lines) + 1
  339.   F0.ShowModal()